import os
import stat
import shutil
import tempfile
from datetime import datetime

##  文件操作工具类

def normalize_jar_path(path):
    """标准化JAR路径为正斜杠格式"""
    # 先替换反斜杠，再替换系统分隔符，确保两种斜杠都能被正确处理
    return path.replace('\\', '/').replace(os.sep, '/').strip().lstrip('/\\')

def jar_path_to_system_path(jar_path, base_dir):
    """将JAR路径（正斜杠）转换为系统路径"""
    if not jar_path:
        return base_dir
    system_path = jar_path.replace('/', os.sep)
    return os.path.join(base_dir, system_path)

class FileUtils:
    @staticmethod
    def check_permissions(path):
        """检查路径的写入权限"""
        dir_path = os.path.dirname(path) if not os.path.isdir(path) else path
        
        if not os.path.exists(dir_path):
            try:
                os.makedirs(dir_path, exist_ok=True)
            except PermissionError:
                return False, f"没有权限创建目录: {dir_path}"
        
        test_file = os.path.join(dir_path, ".permission_test.tmp")
        try:
            with open(test_file, 'w') as f:
                f.write("test")
            os.remove(test_file)
            return True, "权限检查通过"
        except PermissionError:
            return False, f"没有权限写入到目录: {dir_path}"
        except Exception as e:
            return False, f"检查权限时出错: {str(e)}"

    @staticmethod
    def handle_remove_readonly(func, path, exc_info):
        """处理删除只读文件的情况"""
        exc_type, exc_val, exc_tb = exc_info
        if exc_type is PermissionError:
            try:
                os.chmod(path, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
                func(path)
            except Exception as e:
                error_msg = f"无法删除只读文件 {path}: {str(e)}"
                return error_msg
        else:
            error_msg = f"删除文件时出错 {path}: {str(exc_val)}"
            raise Exception(error_msg)

    @staticmethod
    def copy_file_with_perms(src, dest):
        """复制文件并保留权限，特殊处理class文件"""
        shutil.copy2(src, dest)
        if dest.endswith('.class'):
            os.chmod(dest, stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP | stat.S_IROTH)

    @staticmethod
    def find_file_in_zip(filename,zip_file_index):
        # 根据文件夹名称(filename)获取压缩包（self.zip_file_index）对应文件夹下所有文件
        folder_files = []
        # 1. 标准化文件夹路径（确保以路径分隔符结尾，统一使用 '/'）
        normalized_folder = filename if filename.endswith('/') else f"{filename}/"
                
        # 2. 遍历压缩包索引中的所有文件条目
        for file_list in zip_file_index.values():
            for file_info in file_list:
                file_path = file_info.get('path', '')
                        
                # 3. 匹配规则：文件路径以目标文件夹路径开头，且不是文件夹本身
                if ((file_path.startswith(normalized_folder) or file_path.find('/'+normalized_folder)!=-1) and 
                    not file_path == normalized_folder):
                        folder_files.append(file_info)
                
        # 4. 返回结果（可根据后续需求使用folder_files变量）
        return folder_files